#ifndef SCOPENODE_H
#define SCOPENODE_H

#include "symbolTable.h"
#include <string>
#include <stack>
#include <map>
using namespace std;

//作用域结点
class ScopeNode
{
public:
    string name;           //块名称
    int depth;             //块深度
    ScopeNode *parentNode; //指向父作用域的指针
    SymbolTable variables; //作用域内的变量符号表

    //初始化ScopeNode
    ScopeNode(string _name, ScopeNode *_parentNode);
    //检查符号是否在该Scope的符号表里,如果不在,则一直沿着父指针向上找
    bool searchSymbol(string symbol);
    //在符号表里插入符号
    bool insertSymbol(string symbol, SymbolTableNode symbolNode);
};

ScopeNode::ScopeNode(string _name, ScopeNode *_parentNode) : name(_name), parentNode(_parentNode)
{
    if (this->parentNode == NULL)
        this->depth = 0;
    else
        this->depth = this->parentNode->depth + 1;
};

bool ScopeNode::searchSymbol(string symbol)
{
    if (variables.find(symbol))
    {
        return true;
    }
    else
    {
        //一直向父作用域寻找该变量,直到最外层作用域为止
        ScopeNode *node = this->parentNode;
        while (node != NULL)
        {
            if (node->variables.find(symbol))
            {
                return true;
            }
            else
            {
                node = node->parentNode;
            }
        }
        return false;
    }
}

//插入符号，在域符号表中插入符号
bool ScopeNode::insertSymbol(string symbol, SymbolTableNode symbolNode)
{
    if (!searchSymbol(symbol))
    {
        variables.insert(symbol, symbolNode);
        return true;
    }
    else
    {
        return false;
    }
}

#endif